REmap是一个基于Echarts http://echarts.baidu.com 的一个R包。主要的目的是为广大数据玩家提供一个简便的,可交互的地图数据可视化工具。目前托管在github, 地址为https://github.com/lchiffon/REmap。
library(devtools)
install_github('lchiffon/REmap')
获取经纬度的函数是基于BaiduAPI的一个获取地理位置的功能。这个函数不仅是REmap下的一个功能,实际上你也可以用它来抓取经纬度数据。
基本函数:
get_city_coord() 获取一个城市的经纬度。
get_geo_position() 获取一个城市向量的经纬度。
library(REmap)
city_vec = c("北京","Shanghai","广州")
get_city_coord("Shanghai")
get_geo_position (city_vec)
注: windows用户会看到city一列为utf-8编码,可以使用get_geo_position (city_vec2)$city查看列向量的信息
绘制迁徙地图使用的是主函数remap()
remap(mapdata, title = "", subtitle = "", theme =get_theme("Dark"))
set.seed(125)
origin = rep("北京",10)
destination = c('上海','广州','大连','南宁','南昌','拉萨','长春','包头','重庆','常州')
dat = data.frame(origin,destination)
out = remap(dat,title = "REmap实例数据",subtitle = "theme:Dark")
plot(out)
该地图会写成一个html文件,保存在电脑里面,并通过浏览器打开该文件.以下的方式都可以看到这个地图:
## Method 1
remap(dat,title = "REmap实例数据",subtitle = "theme:Dark")
## Method 2
out = remap(dat,title = "REmap实例数据",subtitle = "theme:Dark")
out
## Method 3
out = remap(dat,title = "REmap实例数据",subtitle = "theme:Dark")
plot(out)
REmap中get_theme提供了迁徙地图中常用颜色的调整:
get_theme(theme = "Dark", lineColor = "Random",
backgroundColor = "#1b1b1b", titleColor = "#fff",
borderColor = "rgba(100,149,237,1)", regionColor = "#1b1b1b")
颜色可以使用颜色名(比如’red’,’skyblue’等),RGB(“#1b1b1b”,“#fff”)或者一个rgba的形式(“rgba(100,100,100,1)”),可以在这里找到颜色对照表.
## default theme:"Bright"
set.seed(125)
out = remap(dat,title = "REmap实例数据",subtitle = "theme:Bright",
theme = get_theme("Bright"))
plot(out)
## 更改线条颜色 set Line color as 'orange'
set.seed(125)
out = remap(dat,title = "REmap实例数据",subtitle = "theme:Bright",
theme = get_theme("None", lineColor = "orange"))
plot(out)
## 更改其他颜色 Set Region Color
out = remap(dat,title = "REmap实例数据",subtitle = "theme:Bright",
theme = get_theme("None",
lineColor = "orange",
backgroundColor = "#FFC1C1",
titleColor = "#1b1b1b",
regionColor = '#ADD8E6'))
plot(out)
remapC是用于创建分级统计图(Choropleth map).即根据子区域数值的多少进行深浅不同的颜色填充的地图形式.目前支持的地图为:
remapC函数的调用形式为:
remapC(data,
maptype = 'china',
color = c('#1e90ff','#f0ffff'),
theme = get_theme("Bright"),
title = "",
subtitle = "",
mindata = NA,
maxdata = NA,
# mark Line & point
markLineData = NA,
markPointData = NA,
markLineTheme = markLineControl(),
markPointTheme = markPointControl(),
geoData = NA)
参数看起来很多,这里仅描述前几个参数,后面的markLine与markPoint是用于在绘制好的地图上添加标线和标点的,会在remapB中详细介绍,remapC中重要的参数有:
用示例数据chinaIphone来做演示:
library(REmap)
head(chinaIphone)
## V1 V2
## 1 \xb1\xb1\xbe\xa9 629
## 2 \xcc\xec\xbd\xf2 516
## 3 \xc9\u03fa\xa3 280
## 4 \xd6\xd8\xc7\xec 933
## 5 \xbaӱ\xb1 296
## 6 \xba\xd3\xc4\xcf 172
remapC(chinaIphone)
更改color参数来调整颜色:
remapC(chinaIphone, color = 'orange') ## 颜色改为白色到橘红色
remapC(chinaIphone, color = c('orange','red')) ## 颜色改为红色到橘红色
此外,使用mapType参数可以改变地图的类型,绘制子地图或者世界地图:
data = data.frame(country = mapNames("world"), value = 5*sample(178)+200)
head(data)
## country value
## 1 Afghanistan 505
## 2 Angola 705
## 3 Albania 775
## 4 United Arab Emirates 295
## 5 Argentina 740
## 6 Armenia 400
remapC(data,maptype = "world",color = 'skyblue')
其中mapNames()函数可以得到某个地图下的子图信息:
mapNames('西藏')
## [1] "那曲地区" "阿里地区" "日喀则地区" "林芝地区" "昌都地区"
## [6] "山南地区" "拉萨市"
data = data.frame(country = mapNames('西藏'), value = 50*sample(7)+200)
head(data)
## country value
## 1 那曲地区 350
## 2 阿里地区 500
## 3 日喀则地区 450
## 4 林芝地区 550
## 5 昌都地区 250
## 6 山南地区 400
remapC(data,maptype = '西藏',color = 'skyblue')
其他的参数:
比如,精细的调整一下最初的地图:
remapC(chinaIphone,
title = "remapC实例地图",
theme = get_theme('none',backgroundColor = '#fff',
titleColor = "#1b1b1b",
pointShow = T),
max = 2000)
最后,再演示下remapC中使用markLine和markPoint的效果:
remapC(chinaIphone,
title = "remapC实例地图",
theme = get_theme('none',backgroundColor = '#fff',
titleColor = "#1b1b1b",
pointShow = T),
max = 2000,
markLineData = demoC,
markPointData = demoC[,2])
remapB是用于创建一个以百度地图为底图的recharts效果,有以下特点:
remapB函数的调用形式为:
remapB(center = c(104.114129,37.550339),
zoom = 5,
color = "Bright",
title = "",
subtitle = "",
markLineData = NA,
markPointData = NA,
markLineTheme = markLineControl(),
markPointTheme = markPointControl(),
geoData = NA)
先说除去markline和markpoint的参数:
get_city_coord获得先来看下没有标点和标线的Bmap效果:
remapB()
可以用remapB来查看某个城市的地图
remapB(get_city_coord("北京"), zoom = 12)
换一个theme:
remapB(color = "Blue")
简单演示下remapB中使用markLine和markPoint的效果:
remapB(title = "Bmap 迁徙图示例",
color = "Blue",
markLineData = demoC,
markPointData = demoC[,2])
markLine是Echarts中进行标线的工具.通过标线(直线,曲线),可以完成很多有意思的可视化
先说一下markLine相关的参数,这些参数可以在remapC或者remapB中调用:
一个简单的示例:
remapB(title = "Remap: 百度迁徙模拟",
color = "Blue",
markLineData = demoC)
markLineTheme控制了标线的风格,使用markLineControl来调用,这里列出主要的参数:
markLineControl(symbolSize = c(2,4),
smoothness = 0.2,
effect = T,
lineWidth = 1,
lineType = 'solid',
color = "Random")
remapB(title = "Remap: 百度迁徙模拟",
color = "Blue",
markLineData = demoC,
markLineTheme = markLineControl(symbolSize = c(0,0),
lineWidth = 10,
lineType = 'dashed'))
设置额外的颜色:
demoC$color = sample(c("red","blue"),10,replace = T)
remapB(title = "Remap: 百度迁徙模拟",
color = "Blue",
markLineData = demoC,
markLineTheme = markLineControl(symbolSize = c(0,0),
lineWidth = 10,
effect = F,
lineType = 'dashed'))
mapC和mapB中,都会有geoData这个变量,用以储存markLine和markPoint的地理位置信息.具体的格式与get_city_coord返回相同:
get_geo_position(c("Beijing","Shanghai","Guangzhou"))
## lon lat city
## 1 116.4136 39.91101 Beijing
## 2 121.4802 31.23631 Shanghai
## 3 113.2708 23.13531 Guangzhou
下面是一个例子,通过这个例子可以看到markLine的使用方式:
这里,我们使用REmap中自带的subway来进行演示,是上海地铁一号线的线路信息,其中subway[[1]]为各个点的经纬度坐标,subway[[2]]为各个点的连线方式.(数据来源于百度API)
各个点的经纬度坐标
head(subway[[1]])
## V1 V2 name
## 1 121.43102542826 31.398676380258 yihaoxian Point 1
## 2 121.43132186908 31.397705460498 yihaoxian Point 2
## 3 121.43154644546 31.396665178073 yihaoxian Point 3
## 4 121.43339695481 31.391602304084 yihaoxian Point 4
## 5 121.43433119254 31.387733681833 yihaoxian Point 5
## 6 121.43766390598 31.374986126392 yihaoxian Point 6
各个点的连线方式
head(subway[[2]])
## origin destination
## 1 yihaoxian Point 1 yihaoxian Point 2
## 2 yihaoxian Point 2 yihaoxian Point 3
## 3 yihaoxian Point 3 yihaoxian Point 4
## 4 yihaoxian Point 4 yihaoxian Point 5
## 5 yihaoxian Point 5 yihaoxian Point 6
## 6 yihaoxian Point 6 yihaoxian Point 7
remapB(center = get_city_coord("上海"),
zoom = 13,
title = "Remap: 上海地铁一号线",
color = "Blue",
markLineData = subway[[2]],
markLineTheme = markLineControl(smoothness = 0,
effect = T,
symbolSize = c(0,0)),
geoData = subway[[1]])
markPoint是Echarts中进行标点的工具.通过不同形状的点(箭头,星,圆或者自定义的图片)来完成点的标注
与markLine类似,markPoint相关的参数,可以在remapC或者remapB中调用:
一个简单的示例:
remapB(title = "Remap: 百度迁徙模拟",
color = "Blue",
markPointData = demoC[,2])
markPointTheme控制了标线的风格,使用markPointControl来调用,这里列出主要的参数:
markPointControl(symbol = 'emptyCircle',
symbolSize = "Random",
effect = T,
effectType = 'scale',
color = "Random")
remapB(title = "Remap: markPoint示例",
color = "Blue",
markPointData = demoC[,2],
markPointTheme = markPointControl(symbol ="diamond",
symbolSize = 7,
effect = T,
effectType = 'bounce'))
mapC和mapB中,都会有geoData这个变量,用以储存markLine和markPoint的地理位置信息.具体的格式与get_city_coord返回相同:
get_geo_position(c("Beijing","Shanghai","Guangzhou"))
## lon lat city
## 1 116.4136 39.91101 Beijing
## 2 121.4802 31.23631 Shanghai
## 3 113.2708 23.13531 Guangzhou
下面的例子,结合了上一节的地铁信息,增加了一些POI的店铺信息
这里,我们使用REmap中自带的geoData来进行演示,数据是是上海自助餐与火锅的POI位置信息,一共30条(数据来源于百度API) 数据是如下的样子:
## lon lat name
## 1 121.4802 31.24210 鑫海汇自助烤肉
## 2 121.4447 31.19689 五月罗马海鲜自助餐厅(徐家汇店)
## 3 121.3307 31.24701 多伦多风情自助餐厅(万达广场店)
## 4 121.4622 31.23414 金钱豹自助餐 中信泰富店
## 5 121.5249 31.23544 五月罗马海鲜自助餐厅
## 6 121.4719 31.22585 上海歌城自助餐(淮海路店)
绘制点图
#前20个标注为天蓝色,后10个标注为红色
pointData = data.frame(geoData$name,
color = c(rep("skyblue",20),
rep("red",10)))
remapB(get_city_coord("上海"),
zoom = 13,
color = "Blue",
title = "上海美食",
markPointData = pointData,
markPointTheme = markPointControl(symbol = 'pin',
symbolSize = 5,
effect = F),
geoData = geoData)
当然在一个地图中可以混合标点与标线的信息
names(geoData) = names(subway[[1]])
remapB(get_city_coord("上海"),
zoom = 13,
color = "Blue",
title = "Remap: MarkPoint&MarkLine",
markPointData = pointData,
markPointTheme = markPointControl(symbol = 'pin',
symbolSize = 5,
effect = F),
markLineData = subway[[2]],
markLineTheme = markLineControl(symbolSize = c(0,0),
smoothness = 0),
geoData = rbind(geoData,subway[[1]]))
## 读取数据
rCon = read.csv("data/R-con.csv",encoding = "UTF-8")
## 准备数据
rCon$pic = paste0("<img src=",rCon$pic," width=300px />")
plotdata = data.frame(place = rCon$place,
symbol = "image://./fig/cos.png",
tooltip = paste(rCon$name,rCon$time,rCon$pic,sep = "<br/>"))
## 绘制地图
remapC(data = chinaIphone,
color = c("white","white"),
markPointData = plotdata,
markPointTheme = markPointControl(effect = F, symbolSize = 30),
title = "2015中国R语言会议")
细心的人可能会发现,上面的代码运行之后并不会出现cos.png作为点的那种图形,那是因为上面图片使用的是相对路径,而程序运行后产生的临时html的路径与我们的当前路径是不同的。你所要做的就是保存完整的临时html到当前路径下,再重新打开就OK了。
声明: 本笔记内容并非原创,主要来自于: http://lchiffon.github.io/中的REmap手册。